本篇為 PHP 系列
__invoke()
是 PHP 眾多魔術方法中的一個,可以用來讓你將物件作為 function
使用,詳細說明可參考官方說明文件。
問題是,把物件當作 function
使用是什麼意思呢?其實就是在物件後面直接加()
,如果還是不清楚,我們接著看以下的範例就知道囉。
範例
我們簡單來實作一個類別,這個類別是一個乘法器,負責運算乘法。
我們把乘數 $multiple
作為建構子的參數傳入,並在 __invoke()
中使用。
class Multiplier
{
private $multiple;
public function __construct($multiple)
{
$this->multiple = $multiple;
}
public function __invoke($number)
{
return $this->multiple * $number;
}
}
要如何利用 __invoke
呢?只要創建出該類別的物件,並把該物件當作 function 來使用就好了,也就是加上括號()
。
下面,我們有兩個簡單範例,在第一個範例《兩倍乘法器》中,我們傳入參數 2 ,創建了一個 Multiplier
物件,並且將這個物件指派給 $double
變數。
接著下一行,我們對變數進行 function call,將 4 作為參數傳入,而這樣的行為就會觸發 __invoke
中的程式,因此會進行 2 * 4 = 8
的運算。《三倍乘法器》也是同樣的邏輯。
兩倍乘法器:
$double = new Multiplier(2);
echo $double(4); // 8
三倍乘法器:
$triple = new Multiplier(3);
echo $triple(4); // 12
如果沒有 __invoke
如果沒有實作 __invoke
而直接把物件作為 function 使用,會出現錯誤。
class Multiplier
{
private $multiple;
public function __construct($multiple)
{
$this->multiple = $multiple;
}
}
$double = new Multiplier(2);
echo $double(4);
錯誤訊息:
PHP Fatal error: Uncaught Error: Object of type Multiplier is not callable
經由這樣的錯誤訊息提示,也可以知道實作 __invoke
後的類別,其物件就會是一種 callable
。
參考
PHP invoke: is anybody using it?
本篇為 PHP 系列